//题目描述
//Farmer John 最近为奶牛们的图书馆添置了一个巨大的书架，尽管它是如此的大，但它还是几乎瞬间就被各种各样的书塞满了。
//现在，只有书架的顶上还留有一点空间。
//
//所有 N(1≤N≤20,000) 头奶牛都有一个确定的身高 Hi(1≤H i≤10,000)。
//设所有奶牛身高的和为S。书架的高度为 B，并且保证 1≤B≤S<2,000,000,007。
//
//为了够到比最高的那头奶牛还要高的书架顶，奶牛们不得不像演杂技一般，一头站在另一头的背上，叠成一座“奶牛塔”。
//当然，这个塔的高度，就是塔中所有奶牛的身高之和。为了往书架顶上放东西，所有奶牛的身高和必须不小于书架的高度。
//
//显然，塔中的奶牛数目越多，整座塔就越不稳定，于是奶牛们希望在能够到书架顶的前提下，让塔中奶牛的数目尽量少。 
//现在，奶牛们找到了你，希望你帮她们计算这个最小的数目。
//
//输入格式
//第 1 行: 2 个用空格隔开的整数：N 和 B；
//第 2…N+1 行: 第 i+1 行是 1 个整数：Hi
//。
//输出格式
//第 1 行: 输出 1 个整数，即最少要多少头奶牛叠成塔，才能够到书架顶部

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 2e4 + 10;
long long q[N];
void quickSort(long long q[], int l, int r)
{
	if(l >= r)
		return;
	int x = q[l], i = l - 1, j = r + 1;
	while(i < j){
		do i++; while(q[i] < x);
		do j--; while(q[j] > x);
		if(i < j) swap(q[i], q[j]);
	}
	quickSort(q, l, j);
	quickSort(q, j + 1, r);
}
long long temp[N];
void mergeSort(long long q[], int l, int r)
{
	if(l >= r)
		return;
	int mid = (l + r) >> 1;
	mergeSort(q, l, mid), mergeSort(q, mid + 1, r);
	int k = 0, i = l, j = mid + 1;
	while(i <= mid && j <= r)
		if(q[i] <= q[j]) temp[k++] = q[i++];
		else temp[k++] = q[j++];
	while(i <= mid) temp[k++] = q[i++];
	while(j <= r) temp[k++] = q[j++];
	for(i = l, j = 0; i <= r; i++, j++)
		q[i] = temp[j];
}
int main()
{
	int n;
	long long b;
	cin >> n >> b;
	for(int i = 0; i < n; i++)
		scanf("%lld", &q[i]);
	//quickSort(q, 0, n - 1);
	mergeSort(q, 0, n - 1);
	int ans = 0;
	long long sum = 0;
	for(int i = n - 1; sum < b; i--){
		sum += q[i];
		ans++;
	}
	cout << ans << endl;
	return 0;
}
